home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 009 / drverr.arc / DRVERR.PAS
Pascal/Delphi Source File  |  1985-07-30  |  3KB  |  84 lines

  1.  
  2. {             Program to solve drive errors on IBM PC
  3.                      Code by Marshall Brain.
  4.  
  5.     The short program contained in this file demonstrates the use
  6. of a procedure that will detect disk errors on the
  7. IBM PC when the drive door is left open. It eliminates the
  8. annoying "abort, retry, ignore?" message generated by DOS for
  9. disk door errors. For example, when using the techniques shown here,
  10. you will get an I/O error of 01 if you attempt to reset a file with
  11. the drive door open, and an F0 if you try to rewrite a file with the
  12. door open. You read these values out of the IOresult variable just
  13. as you normally would, using $I- and $I+.
  14.     To use the technique shown here in your own programs, you
  15. will need to do two things. First, you must copy BOTH the "setup"
  16. procedure and the "int24" procedure into your program. Then you
  17. must call "setup" before the int24 procedure will be effective.
  18. "Setup" redirects DOS to the int24 procedure to handle errors. You
  19. must also insure that "int24" is never swapped out in an overlay,
  20. or the program will blow up. Please note that "setup" uses the "y"
  21. variable to pick up the code segment location. You can use this
  22. technique, or any other that you prefer. I just know that this
  23. one works.
  24.     To run the example program given here, create a file called
  25. "door.chk" on drive A: and run the program. It will work fine, and
  26. reset the file with no problem. Then try leaving the drive door
  27. open. After about 5 seconds, you will get the message that the door
  28. is open, or that the file doesn't exist.
  29.     This technique isn't perfect - on file reading, you
  30. only know whether the file is there OR that the door is open.
  31. You never know which it is. On file writing you know that the door
  32. is open, OR that the disk is full, but never which one. Also Note
  33. that the DOS printer error  gets tossed back to you by this
  34. routine, so keep that in mind.
  35.     For me, this program is not perfect, but better than nothing. I
  36. hope it is helpful.   -MB}
  37.  
  38.     program int24tst;
  39.     const
  40.       y : integer = 0;
  41.     var
  42.       fileptr:text;
  43.  
  44.     procedure int24;
  45.     {To understand this routine, you will need to read}
  46.     {the description on Interrupt 24 in the DOS manual}
  47.     begin
  48.       inline
  49.        ($58/   {POP AX  Discard first 3 words on stack}
  50.         $58/   {POP AX    }
  51.         $58/   {POP AX    }
  52.         $58/   {POP AX  Pop all registers}
  53.         $5b/   {POP BX    }
  54.         $59/   {POP CX    }
  55.         $5a/   {POP DX    }
  56.         $5e/   {POP SI    }
  57.         $5f/   {POP DI    }
  58.         $5d/   {POP BP    }
  59.         $1f/   {POP DS    }
  60.         $07/   {POP ES    }
  61.         $cf);  {IRET    Return to next instruction}
  62.     end;
  63.  
  64.     procedure setup;
  65.     {Change interrupt vector 24 to point to the int24 procedure}
  66.     var result : record ax,bx,cx,dx,bp,si,di,ds,es,flags:integer; end;
  67.     begin
  68.       result.ds:=seg(y); {typed constants are stored in code seg}
  69.       result.dx:=ofs(int24)+7;
  70.       result.ax:=$2524;
  71.       intr($21,result);
  72.     end;
  73.  
  74.     begin
  75.       setup;
  76.       assign(fileptr,'a:door.chk');
  77.       {$I-}
  78.       reset(fileptr);
  79.       {$I+}
  80.       if IOresult<>0 then
  81.         writeln('Either the drive door is open, or DOOR.CHK does not exist');
  82.       close(fileptr);
  83.     end.
  84.